package com.cskaoyan.javase.oop1._5this;

import sun.management.snmp.jvminstr.JvmThreadInstanceEntryImpl;

/**
 * this关键字
 *
 * 学习完对象与类后，做以下练习：
 * 创建一个汽车类，有颜色（color）和速度（speed）两个属性，行为是可以跑（run）。
 *
 * 在成员方法中如果直接访问成员变量,那就会得到成员变量的取值
 * 但是现在:
 * 在成员方法的形参列表中,加一个局部变量
 * 该局部变量和成员变量的名字相同,类型也一样
 * 这样访问的结果是什么呢?
 * 访问的结果是同名的局部变量,是方法传入的参数
 * 这是一种就近原则
 *
 * 如果在上述情况下,我们仍然想访问同名的成员变量,那如何做到呢?
 * 按照以往的知识是做不到的
 * 需要使用this关键字
 *
 * this关键字:
 * 在类中的成员方法中,每个成员方法的形参列表中
 * 都隐含了一个传参: 当前对象的传参
 * 这个隐含的当前对象的传参,用this关键字指向
 * 所以:
 *      this指向当前对象,它是一个引用
 *
 * 那么什么是当前对象呢?
 * 成员方法必须要使用一个对象调用它,那么谁来调用成员方法,谁就是当前对象
 *
 * 知道this的概念后,那么如何在成员方法中访问同名的成员变量呢?
 * 使用"this."访问,以示区分(非常重要)
 *
 * this关键字的作用:
 * 既然this已经指向当前对象，是一个引用，那么它基本的用途就有：
 *
 * 1.在成员方法中，用this引用去访问类中成员变量和调用类中成员方法。
 *      由于this本身就是隐含的，所以一般情况下，可以省略this，直接访问类中成员。
 *      这里就解释了 为什么成员方法中可以直接访问类中的成员变量和成员方法
 *      (因为隐含了this指向了当前对象,成员方法中是有对象的)
 *      static方法中没有this传参,没有当前对象
 *      就无法直接访问成员变量/方法
 *      如果还想访问,那就自己创建一个对象
 *
 *      扩展:
 *          在一个类当中,static方法和static方法之间是可以直接用方法名互相调用的
 *          非static方法和非static方法(成员方法)之间是可以直接用方法名互相调用的
 *
 *
 * 2.特殊情况下，当成员方法中的局部变量和成员变量同名时，可以用 "this."访问 来表示访问同名成员变量，来和同名局部变量做区分。
 * 这种情况，this是不能省略的。
 *
 * 3.在成员方法中只要使用 "this."访问 一个变量，那么该变量一定是成员变量。在代码比较复杂的情况下，可以显著增加代码可读性。
 *
 *
 *
 *
 * @since 10:49
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Car c = new Car();
        // c.run();
        // 对于这一次run方法的调用来说,c对象就是this指向的当前对象
        c.run(200);
        c.speed = 300;
        c.run(200);
        System.out.println("----------------------");
        c.test(200);
        System.out.println("----------------------");
        // this是一个引用指向当前对象,不同的对象调用方法,this指向的对象是不同的
        Car c1 = new Car();
        Car c2 = new Car();
        System.out.println("c1:");
        c1.printThis();
        System.out.println(c1);
        System.out.println("c2:");
        c2.printThis();
        System.out.println(c2);
    }
}

class Car {
    // 默认值是\u0000 绝对空字符
    char color = '黑';
    double speed = 120;
    int var = 100;

    public void run(double speed) {
        // 在成员方法中可以直接访问成员变量
        System.out.println(color + "色的小汽车在高速公路上,以每小时" + this.speed + "公里的速度奔驰~~");
    }

    public void test(int var) {
        System.out.println(color);
        printThis();
        System.out.println(this.var);
    }

    public void printThis() {
        System.out.println(this);
    }

    public static void testStatic() {
        testStatic2();
    }

    public static void testStatic2() {
        // System.out.println(var);
    }
}

